[AWS] DocumentDB 詳細解説:MongoDB からのデータ移行
こんにちは、菊池です。
先日登場したAmazon DocumentDBをいろいろと触っています。
- [速報] MongoDB 互換のマネージドデータベース!Amazon DocumentDB が登場しました
- [AWS] DocumentDB 詳細解説:クラスターの作成と設定項目
- [AWS] DocumentDB 詳細解説:MongoDB との違いを理解する
今回は、既存のMongoDBからのデータ移行方法を検証してみました。
DocumentDBへのデータ移行方法
MongoDBからDocumentDBへのデータ移行方法は大きく2つです。
- 既存のMongoDBからダンプデータを取得して、DocumentDBにリストア
- DMS(Database Migration Service)の利用
ダンプデータの移行では、MongoDB公式で提供している、mongodump/mongorestoreが使用可能です。
似たツールとして、mongoexport/mongoimportというものもありますが、mongodumpの場合にはIndexなどのメタデータを含めて移行することが可能です。詳細はこちらをご確認ください。
AWSが提供するデータベース移行サービスである、DMSを使っての移行も可能です。従来より、ソース(移行元)としてMongoDBをサポートしてましたが、DocumentDBの登場にあわせてターゲット(移行先)としてDocumentDBをサポートしました。DMSを使う利点はなりより、CDC(Chage Data Capcher)を使っての継続的な移行が可能なことです。ある時点での一括移行だけでなく、更新内容をキャプチャし差分同期することで、ダウンタイムを極力抑えた移行が可能です。ただし、CDCを使うためには、ソースのMongoDBがレプリカセットクラスタ構成であることが必須です。これは、レプリカセットクラスタの同期に利用されるOplogを、CDCでも利用するためです。
ダンプデータの移行
それでは、まずダンプデータの移行を試してみます。
mongodump/mongorestoreは、MongoDB本体プロセスであるmongodと同時に、mongodb-org-toolsをインストールしていれば利用可能です。検証では、ソースDBとして、EC2(Amazon Linux)にインストールしたMongoDB バージョン3.6を使用しています。移行対象データは、以下のチュートリアルに記載のデータをインポートしています。
まず、移行前のデータの確認です。
> use zips-db switched to db zips-db > db.stats() { "db" : "zips-db", "collections" : 1, "views" : 0, "objects" : 29353, "avgObjSize" : 94.50938575273396, "dataSize" : 2774134, "storageSize" : 1429504, "numExtents" : 0, "indexes" : 1, "indexSize" : 315392, "fsUsedSize" : 1775960064, "fsTotalSize" : 8318783488, "ok" : 1 } > show collections zips > db.zips.count() 29353
zips-db
データベースのzips
コレクションに、29353
件のデータが保存されています。これをmongodumpで取得します。
$ mongodump --host 172.31.54.185 \ > --port 27017 \ > --db zips-db \ > --out dumpdata 2019-02-10T05:50:04.231+0000 writing zips-db.zips to 2019-02-10T05:50:04.297+0000 done dumping zips-db.zips (29353 documents)
取得できました。ディレクトリをみると、BSONデータ本体とメタデータが取得できています。
$ ls -l dumpdata/zips-db/ 合計 2716 -rw-rw-r-- 1 ec2-user ec2-user 2774134 2月 10 05:50 zips.bson -rw-rw-r-- 1 ec2-user ec2-user 126 2月 10 05:50 zips.metadata.json
これをmondorestoreでDocumentDBにリストアします。ホストにDocumentDBのクラスタエンドポイントを指定しましょう。
$ mongorestore --host docdb-2019-02-10-05-25-07.cluster-xxxxxxxxxxxx.us-east-1.docdb.amazonaws.com \ > --port 27017 \ > --username skikuchi \ > --password xxxxxxxxx \ > --db zips-db zips-db/ 2019-02-10T06:11:27.723+0000 the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead 2019-02-10T06:11:27.723+0000 building a list of collections to restore from zips-db dir 2019-02-10T06:11:27.731+0000 reading metadata for zips-db.zips from zips-db/zips.metadata.json 2019-02-10T06:11:27.772+0000 restoring zips-db.zips from zips-db/zips.bson 2019-02-10T06:11:28.800+0000 no indexes to restore 2019-02-10T06:11:28.800+0000 finished restoring zips-db.zips (29353 documents) 2019-02-10T06:11:28.800+0000 done
インポートできました。DB、コレクション、データ件数とも一致しています。
rs0:PRIMARY> show dbs zips-db 0.005GB rs0:PRIMARY> use zips-db switched to db zips-db rs0:PRIMARY> db.stats() { "db" : "zips-db", "collections" : 1, "objects" : 29353, "storageSize" : 4956160, "indexes" : 1, "indexSize" : 942080, "fileSize" : 5898240, "ok" : 1 } rs0:PRIMARY> show collections zips rs0:PRIMARY> db.zips.count() 29353
DMSの利用
続いて、DMSでの移行を試してみます。先ほどと同じデータを使用して、以下のチュートリアルに従って実施しました。
手順は以下の通りです。
- レプリケーションインスタンスの作成
- ソースエンドポイントの作成
- ターゲットエンドポイントの作成
- タスクの実行
まずはレプリケーションインスタンスの作成です。今回は、ソースDB(MongoDB)、ターゲットDB(DocumentDB)ともに同じ VPC内に作成しています。エンジンバージョンを最新にし、同じVPC内にレプリケーションインスタンスを作成します。
続いて、ソースエンドポイントの作成です。移行元は認証/SSLとも有効にしていないので、「none」を選択しています。メタデータモードは、「Document」を選択してください。
次に、ターゲットエンドポイントです。ターゲットエンジンに、「docdb」を選択し、サーバ名にDocumentDBのクラスタエンドポイントを指定します。
最後に、タスクの作成です。作成したレプリケーションインスタンス、ソース/ターゲットエンドポイントを選択して実行します。なお、移行タイプとしてCDCも有効にしましたが、ソースがスタンドアロン構成のため機能しませんでした。
タスクが開始されました。
間も無く、フルロードが完了して、29,353件のデータが移行ずみになしました。
DocumentDBに接続して、データを確認してみます。
rs0:PRIMARY> show dbs awsdms_control 0.000GB zips-db 0.005GB rs0:PRIMARY> use zips-db switched to db zips-db rs0:PRIMARY> db.stats() { "db" : "zips-db", "collections" : 1, "objects" : 29353, "storageSize" : 4956160, "indexes" : 1, "indexSize" : 942080, "fileSize" : 5898240, "ok" : 1 } rs0:PRIMARY> db.zips.count() 29353
ちゃんと移行できたようです。
まとめ
DocumentDBからの移行方法として、ダンプ取得による移行、DMSを使った移行を紹介しました。
サービス停止による静止点の確保が可能であれば、mongodump/mongorestoreを使った移行がシンプルですし、インデックスなども移行できるのでよいのではないでしょうか。DMSを使う場合には、CDCが使えることが最大の利点と言えるでしょう。